RxJava-তে Error Handling এবং Resource Management সঠিকভাবে করা অত্যন্ত গুরুত্বপূর্ণ, কারণ অ্যাসিঙ্ক্রোনাস অপারেশনে ত্রুটি বা রিসোর্স লিক সহজেই হতে পারে। নিচে RxJava-এর জন্য কিছু Best Practices তুলে ধরা হলো:
Error Handling Best Practices
- Errors Properly Propagate করুন
- onErrorResumeNext() ব্যবহার করে বিকল্প স্ট্রিমে স্যুইচ করুন।
- onErrorReturn() ব্যবহার করে ডিফল্ট মান প্রদান করুন।
উদাহরণ:
observable .onErrorResumeNext(throwable -> Observable.just("Fallback value")) .subscribe(System.out::println, Throwable::printStackTrace);
- Global Error Handler ব্যবহার করুন
RxJavaPlugins.setErrorHandler() ব্যবহার করে এমন ত্রুটি হ্যান্ডল করুন, যা অন্য কোথাও ধরা যায়নি।
RxJavaPlugins.setErrorHandler(e -> { // Log or handle the uncaught exception System.err.println("Unhandled Error: " + e); });
- Exceptions Avoid করুন যেখানে সম্ভব
- স্ট্রিমে না-চাওয়া NullPointerException বা অনাকাঙ্ক্ষিত অবস্থা এড়াতে, আগে থেকেই ইনপুট যাচাই করুন।
- Retry Logic যোগ করুন
retry() বা retryWhen() ব্যবহার করে পুনরায় চেষ্টা করার ব্যবস্থা রাখুন।
observable .retryWhen(errors -> errors.delay(1, TimeUnit.SECONDS)) .subscribe(System.out::println, Throwable::printStackTrace);
- Specific Exception Handling
- filter() বা catch() ব্লক ব্যবহার করে নির্দিষ্ট ধরনের ত্রুটি হ্যান্ডল করুন।
Resource Management Best Practices
- Dispose Properly
CompositeDisposable ব্যবহার করুন একাধিক ডিসপোজেবল একত্রে পরিচালনা করতে।
CompositeDisposable compositeDisposable = new CompositeDisposable(); Disposable disposable = observable.subscribe(); compositeDisposable.add(disposable); compositeDisposable.dispose(); // Dispose all
- autoDispose বা Scope Binding ব্যবহার করুন
- AutoDispose লাইব্রেরি ব্যবহার করে লিক এড়াতে Lifecycle এর সাথে Observable বেঁধে রাখুন।
- using() অপারেটর ব্যবহার করুন
রিসোর্স তৈরি ও পরিষ্কার করার জন্য using() অপারেটর ব্যবহার করুন।
Observable.using( () -> new Resource(), // Resource creation resource -> Observable.just(resource.data), // Resource usage Resource::close // Resource cleanup ).subscribe();
- Avoid Long-Lived Subscriptions
- সাবস্ক্রিপশন যেন বেশি সময় ধরে চলতে না থাকে, তা নিশ্চিত করুন। যেখানে সম্ভব, take(), timeout() বা limit() ব্যবহার করুন।
- Schedulers Management
- রিসোর্স অপ্টিমাইজ করার জন্য সঠিক Scheduler ব্যবহার করুন।
উদাহরণ: I/O অপারেশনের জন্য Schedulers.io() এবং কম্পিউটেশনের জন্য Schedulers.computation()।
- রিসোর্স অপ্টিমাইজ করার জন্য সঠিক Scheduler ব্যবহার করুন।
- Leak Detection Tools ব্যবহার করুন
- RxJavaPlugins এবং LeakCanary এর মত টুল ব্যবহার করে মেমোরি লিক চিহ্নিত করুন।
উদাহরণ (Error Handling ও Resource Management):
CompositeDisposable disposables = new CompositeDisposable();
Observable<String> observable = Observable.create(emitter -> {
emitter.onNext("Item 1");
emitter.onError(new RuntimeException("Error occurred"));
emitter.onComplete();
});
Disposable disposable = observable
.onErrorReturnItem("Fallback Item")
.doFinally(() -> System.out.println("Cleaning up resources"))
.subscribe(
System.out::println,
throwable -> System.err.println("Error: " + throwable.getMessage()),
() -> System.out.println("Completed")
);
disposables.add(disposable);
disposables.dispose(); // Clean up all disposables
Key Points:
- Error Handling: Errors কন্ট্রোল করা যেন স্ট্রিম ব্যাহত না করে।
- Resource Management: রিসোর্স ক্লিন-আপ যেন অটোমেটেড হয় এবং মেমোরি লিক প্রতিরোধ করা যায়।
এই Best Practices অনুসরণ করলে RxJava অ্যাপ্লিকেশনের স্থায়িত্ব ও পারফরম্যান্স উন্নত হবে।
Read more